namespace Test.ConsoleProgram.Algorithm.Solution
{
    [TestDescription("算法: 0463. 岛屿的周长")]
    public class No0463_IslandPerimeter : AbsBaseTestItem
    {
        /*
        给定一个包含 0 和 1 的二维网格地图，其中 1 表示陆地 0 表示水域。
        网格中的格子水平和垂直方向相连（对角线方向不相连）。整个网格被水完全包围，但其中恰好有一个岛屿（或者说，一个或多个表示陆地的格子相连组成的岛屿）。
        岛屿中没有“湖”（“湖” 指水域在岛屿内部且不和岛屿周围的水相连）。格子是边长为 1 的正方形。网格为长方形，且宽度和高度均不超过 100 。计算这个岛屿的周长。
        */

        public override void OnTest()
        {
            Assert.TestExe(IslandPerimeter,
                new int[][]
                {
                    new int[] {0,1,0,0},
                    new int[] {1,1,1,0},
                    new int[] {0,1,0,0},
                    new int[] {1,1,0,0},
                }, 16);
        }

        public int IslandPerimeter(int[][] grid)
        {
            int[] dx = new int[] { 0, 1, 0, -1 };
            int[] dy = new int[] { 1, 0, -1, 0 };
            int n = grid.Length, m = grid[0].Length;
            int ans = 0;
            for (int i = 0; i < n; ++i)
            {
                for (int j = 0; j < m; ++j)
                {
                    if (grid[i][j] == 1)
                    {
                        int cnt = 0;
                        for (int k = 0; k < 4; ++k)
                        {
                            int tx = i + dx[k];
                            int ty = j + dy[k];
                            if (tx < 0 || tx >= n || ty < 0 || ty >= m || grid[tx][ty] == 0)
                            {
                                cnt += 1;
                            }
                        }
                        ans += cnt;
                    }
                }
            }
            return ans;
        }
    }
}
